home *** CD-ROM | disk | FTP | other *** search
/ SPACE 1 / SPACE - Library 1 - Volume 1.iso / apps / 296 / monoware / monoware.s < prev   
Text File  |  1988-11-12  |  11KB  |  373 lines

  1. ; The Mono Emulator. By Mick West.  September 1987.
  2.  
  3. ; Routine to make the ST think it is in mono mode. Needs TOS in ROM
  4. ; Makes the system think that there is a mono screen, but actually
  5. ; be updating a medium real screen from this under Vblank interrupt
  6. ; The XBIOS calls; Physbase,Setscreen and Getrez are revectored.
  7.  
  8. START:
  9.  MOVE.L #MESSAGE,-(SP)
  10.  MOVE.W #9,-(SP)                ; Print startup message
  11.  TRAP #1
  12.  ADDQ.L #6,SP
  13.  
  14. INLOOP:
  15.  MOVE.L #INPUT,-(SP)
  16.  MOVE.W #9,-(SP)                ; Print input message
  17.  TRAP #1
  18.  ADDQ.L #6,SP
  19.  MOVE.B #3,MESSAGE              ; Input length = 3
  20.  MOVE.L #MESSAGE,-(SP)
  21.  MOVE.W #10,-(SP)
  22.  TRAP #1                        ; Input number
  23.  ADDQ.L #6,SP
  24.  MOVE.W #40,D0                  ; Default = 40
  25.  TST.B MESSAGE+1
  26.  BEQ DEFAULT                    ; If len=0
  27.  CMP.B #1,MESSAGE+1             ; len of 1 not allowed
  28.  BEQ INLOOP
  29.  CLR.W D0
  30.  MOVE.B MESSAGE+2,D0            ; first digit
  31.  SUB.W #48,D0
  32.  BLE INLOOP                     ; Too low
  33.  CMP.W #9,D0
  34.  BGT INLOOP                     ; Too High (>100)
  35.  MULU #10,D0
  36.  CLR.W D1
  37.  MOVE.B MESSAGE+3,D1            ; second digit
  38.  SUB.W #48,D1
  39.  BLT INLOOP                     ; Too low
  40.  CMP.W #9,D1
  41.  BGT INLOOP                     ; Too high
  42.  ADD.W D1,D0
  43.  CMP.W #80,D0
  44.  BGT INLOOP                     ; Check less than 80
  45. DEFAULT:
  46.  MOVE.W D0,SCANPOKE+2
  47.  
  48.  
  49.  CLR.L -(SP)
  50.  MOVE.W #32,-(SP)
  51.  TRAP #1                        ; ENTER SUPER MODE
  52.  ADDQ.L #6,SP
  53.  
  54.  MOVE.W  #$2700,SR              ; Normal ROM reset routine starts here
  55.  RESET
  56.  CMP.L   #$FA52235F,$FA0000.L
  57.  BNE     FC003C
  58.  LEA     FC003C,A6
  59.  JMP     $FA0004.L
  60. FC003C:
  61.  LEA     FC0044,A6
  62.  JMP     $FC05D8
  63. FC0044:
  64.  BNE     FC0050
  65.  MOVE.B  $000424.L,$FF8001.L
  66. FC0050:
  67.  SUB.L   A5,A5
  68.  CMP.L   #$31415926,$0426(A5)
  69.  BNE     FC0074
  70.  MOVE.L  $042A(A5),D0
  71.  TST.B   $042A(A5)
  72.  BNE     FC0074
  73.  BTST    #$0000,D0
  74.  BNE     FC0074
  75.  MOVE.L  D0,A0
  76.  LEA     FC0050,A6
  77.  JMP     (A0)
  78. FC0074:
  79.  LEA     $FF8800.L,A0
  80.  MOVE.B  #$0007,(A0)
  81.  MOVE.B  #$00C0,$0002(A0)
  82.  MOVE.B  #$000E,(A0)
  83.  MOVE.B  #$0007,$0002(A0)
  84.  BTST    #$0000,$FC001D
  85.  BEQ     FC00A6
  86.  LEA     FC009E,A6
  87.  JMP     $FC0CE4
  88. FC009E:
  89.  MOVE.B  #$0002,$FF820A.L
  90. FC00A6:
  91.  MOVE.B  #$0001,$FF8201.L
  92.  MOVE.B  #$0000,$FF8203.L
  93.  SUB.L   A5,A5
  94. ; Memory sizing missed out
  95.  MOVE.W  #$093A,A0
  96.  MOVE.L  #$00010000,A1
  97.  MOVEQ   #$00,D0
  98. FC01D0:
  99.  MOVE.W  D0,(A0)+
  100.  CMP.L   A0,A1
  101.  BNE     FC01D0
  102. ;
  103. ; SCREEN SET UP HERE
  104. ;
  105.  MOVE.L  $042E(A5),A0           ; Phystop of RAM
  106.  SUB.L   #$00008000,A0          ; less 32K
  107.  MOVE.L  A0,$044E(A5)           ; is the Physbase of screen
  108.  MOVE.L  A0,MED+SPACE           ; Set MED
  109.  MOVE.B  $044F(A5),$FF8201.L    ; configure hardware addr
  110.  MOVE.B  $0450(A5),$FF8203.L
  111.  MOVE.W  #$0777,$FF8240         ; White background
  112.  MOVE.W  #$0000,$FF8246         ; Black ink for double line
  113.  MOVE.W  #$07FF,D1
  114. FC01F8:
  115.  MOVE.L  D0,(A0)+
  116.  MOVE.L  D0,(A0)+
  117.  MOVE.L  D0,(A0)+
  118.  MOVE.L  D0,(A0)+
  119.  DBF     D1,FC01F8              ; clear the screen
  120.  MOVE.L $044E(A5),A0
  121.  SUB.L #$8000,A0                ; Reserve another 32k
  122.  MOVE.L A0,$044E(A5)            ; For the mono screen
  123.  MOVE.L A0,MONO+SPACE           ; Set MONO
  124.  MOVE.L  $FC0014,A0
  125.  CMP.L   #$87654321,(A0)
  126.  BEQ     FC0214
  127.  LEA     $FC0008,A0
  128. FC0214:
  129.  MOVE.L  $0004(A0),$0004FA.L
  130.  MOVE.L  $0008(A0),$0004FE.L
  131.  MOVE.L  #$00FC0D60,$046A(A5)
  132.  MOVE.L  #$00FC10D2,$0476(A5)
  133.  MOVE.L  #$00FC0DE6,$0472(A5)
  134.  MOVE.L  #$00FC0F96,$047E(A5)
  135.  MOVE.L  #$00FC137C,$047A(A5)
  136.  MOVE.L  #$00FC1F34,$0506(A5)
  137.  MOVE.L  #$00FC1EA0,$050A(A5)
  138.  MOVE.L  #$00FC1F6E,$050E(A5)
  139.  MOVE.L  #$00FC1F86,$0512(A5)
  140.  MOVE.L  #$00FC0C2C,$0502(A5)
  141.  
  142.  MOVE.L  $044E(A5),$0436(A5)    ; Memtop = Physbase
  143.  SUB.L   #$400,$0436(A5)        ;          minus 1k
  144.  
  145.  MOVE.L  $04FA(A5),$0432(A5)
  146.  LEA     $004DB8.L,A7
  147.  MOVE.W  #$0008,$0454(A5)
  148.  ST      $0444(A5)
  149.  MOVE.W  #$0003,$0440(A5)
  150.  MOVE.L  #$0000167A,$04C6(A5)
  151.  MOVE.W  #$FFFF,$04EE(A5)
  152.  MOVE.L  #$00FC0000,$04F2(A5)
  153.  MOVE.L  #$0000093A,$04A2(A5)
  154.  MOVE.L  #$00FC05C0,$046E(A5)
  155.  LEA     $FC0724,A3
  156.  LEA     $FC05C0,A4
  157.  CMP.L   #$FA52235F,$FA0000.L
  158.  BEQ     FC02F6
  159.  LEA     $FC0A1A,A1
  160.  ADD.L   #$02000000,A1
  161.  LEA     $000008.L,A0
  162.  MOVE.W  #$003D,D0
  163. FC02E4:
  164.  MOVE.L  A1,(A0)+
  165.  ADD.L   #$01000000,A1
  166.  DBF     D0,FC02E4
  167.  MOVE.L  A3,$000014.L
  168. FC02F6:
  169.  MOVE.L  #$00FC061E,$0068(A5)
  170.  MOVE.L  A3,$0088(A5)
  171.  MOVE.L  #$00FC074E,$00B4(A5)
  172.  MOVE.L  #$00FC9C48,$0028(A5)
  173.  MOVE.L  A4,$0400(A5)
  174.  MOVE.L  #$00FC0744,$0404(A5)
  175.  MOVE.L  A4,$0408(A5)
  176.  
  177.  MOVE.L $0436(A5),A0
  178.  ADD.L #SPACE-XBIOS,A0
  179.  MOVE.L A0,POKE1+2              ; SPACE ADDR
  180.  MOVE.L A0,POKE2+2              ; IN BOTH ROUTINES
  181.  MOVE.L #0,MONOPOS+SPACE        ; SET FLY TO TOP OF SCREEN
  182. SCANPOKE:
  183.  MOVE.W #40,MONOLINES+SPACE     ; FORTY LINES/VBLAN DEFAULT
  184.  MOVE.W #0,MONOCOUNT+SPACE      ; NONE DONE YET
  185.  MOVE.L $0436(A5),A2            ; Get Memtop
  186.  MOVE.L #XBIOS,A1               ; NOW MOVE THE
  187.  MOVE.W #XEND-XBIOS-1,D0        ; CODE FOR XBIOS & VBLANK
  188. XMOVE:                          
  189.  MOVE.B (A1)+,(A2)+
  190.  DBF D0,XMOVE
  191.  LEA GEN,A1                     ; Generate the move code
  192.  MOVE.W #39,D0                  ; 40 MOVE's  to the first plane
  193. GENMOVE1:
  194.  MOVE.L (A1),(A2)+
  195.  DBF D0,GENMOVE1
  196.  ADDQ.L #4,A1
  197.  MOVE.W (A1)+,(A2)+             ; Move the SUB #158,A0
  198.  MOVE.L (A1)+,(A2)+
  199.  MOVE.W #39,D0                  ; 40 MOVE's to the other plane
  200. GENMOVE2:
  201.  MOVE.L (A1),(A2)+
  202.  DBF D0,GENMOVE2
  203.  ADDQ.L #4,A1
  204.  MOVE.W (A1),(A2)+              ; Move the RTS
  205.  
  206.  MOVE.L $0436(A5),A0
  207.  MOVE.L A0,$B8                  ; New XBIOS  Vector  to $B8
  208.  ADD.L #VBLANK-XBIOS,A0
  209.  MOVE.L A0,$70                  ; New VBLANK Vector  to $70
  210.  LEA     $04CE(A5),A0
  211.  MOVE.L  A0,$0456(A5)
  212.  MOVE.W  #$0007,D0
  213. FC033E:
  214.  CLR.L   (A0)+
  215.  DBF     D0,FC033E
  216.  JSR     $FC21B4
  217.  MOVEQ   #$02,D0
  218.  JSR     $FC0596
  219. FC0360:
  220.  LEA     FC0376,A6
  221.  JMP     $FC0CE4                ; Wait for fly
  222. FC0376:
  223.  MOVE.B  #$0001,$FF8260.L       ; Hardware to medium
  224.  MOVE.B  #$0002,$00044C.L       ; software to mono
  225. FC0386:
  226.  JSR     $FCA76A.L
  227. FC03A0:
  228.  JMP $FC03A8                    ; Jump back into ROM
  229.  
  230.  
  231. XBIOS:                          
  232.  MOVEM.L A1/A2,-(SP)
  233. POKE1:
  234.  MOVE.L #0,A1
  235.  MOVE.L SP,A2                   ; A2=STACK
  236.  ADD.L #8,A2                    ; SKIP A1/A2
  237.  BTST #5,(A2)                   ; IF CALLED FROM USER MODE
  238.  BNE NOTUSER                    ; THEN
  239.  MOVE.L USP,A2                  ; GET THE USER STACK
  240.  SUB.L #6,A2                    ; OFFSET AS SUPER STACK
  241. NOTUSER:
  242.  MOVE.W $6(A2),D0               ; GET CODE
  243.  CMP.W #2,D0                    ; CHECK FOR PHYSBASE CODE
  244.  BEQ PHYSBASE                   ; JUMP TO NEW PHYSBASE ROUTINE
  245.  CMP.W #4,D0                    ; CHECK FOR GETREZ CODE
  246.  BEQ GETREZ                     ; JUMP TO NEW GETREZ ROUTINE
  247.  CMP.W #5,D0                    ; CHECK FOR SETSCREEN CODE
  248.  BNE NORM_XBIOS                 ; NOTHING NEEDS CHANGING SO NORMAL XBIOS
  249.  MOVE.W #-1,16(A2)              ; NO CHANGE TO RESOLUTION
  250.  MOVE.L 12(A2),D0               ; GET NEW PHYS
  251.  CMP.L #-1,D0                   ; IF NEGATIVE
  252.  BEQ NORM_XBIOS                 ; THEN NO CHANGE
  253.  MOVE.L D0,MONO(A1)             ; NEW BASE FOR MONO
  254.  MOVE.L #-1,12(A2)              ; SET TO NO CHANGE
  255.  BRA NORM_XBIOS                 ; AND CONTINUE WITH NORMAL XBIOS
  256. PHYSBASE:
  257.  MOVE.L MONO(A1),D0             ; GET MONO ADDR
  258.  MOVEM.L (SP)+,A1/A2
  259.  RTE                            ; AND RETURN IT AS 'REAL' SCREEN
  260. GETREZ:
  261.  MOVE.W #2,D0                   ; RETURN MONO RESOLUTION
  262.  MOVEM.L (SP)+,A1/A2
  263.  RTE
  264. NORM_XBIOS:
  265.  MOVEM.L (SP)+,A1/A2
  266.  JMP $FC0748                    ; JUMP INTO THE NORMAL XBIOS ROUTINE
  267.  
  268. VBLANK: 
  269.  MOVEM.L D0-D7/A0-A6,-(SP)
  270.  MOVE.W #$333,$FF8242           ; Grey for the single width lines
  271.  MOVE.W #$333,$FF8244           ; For 01 and 10
  272.  BTST #0,$FF8240                ; Check inverted
  273.  BEQ INVERT                     ; Jump if so
  274.  MOVE.W #$777,$FF8240           ; White background
  275.  MOVE.W #$000,$FF8246           ; Black ink
  276.  BRA POKE2
  277. INVERT:
  278.  MOVE.W #$000,$FF8240           ; Black background
  279.  MOVE.W #$777,$FF8246           ; White ink
  280. POKE2:
  281.  MOVE.L #0,A5                   ; A5 To base of variable space
  282.  CLR.L D0
  283.  MOVE.B $FF8201,D0              ; Video base high
  284.  LSL.L #8,D0
  285.  MOVE.B $FF8203,D0              ; Video base low
  286.  LSL.L #8,D0
  287.  MOVE.L D0,A3
  288.  MOVE.L MONO(A5),A0
  289.  MOVE.L MED(A5),A1
  290.  CMP.L A1,A3                    ; Is MED still the real screen
  291.  BEQ MEDOK                      ; Yes so jump
  292.  MOVE.L A3,A0
  293.  MOVE.L A0,MONO(A5)             ; Set MONO From new Physbase
  294.  MOVE.L A1,D0
  295.  LSR.L #8,D0
  296.  MOVE.B D0,$FF8203              ; Set Physbase back to MED
  297.  LSR.L #8,D0
  298.  MOVE.B D0,$FF8201
  299. MEDOK:
  300.  MOVE.L MONOPOS(A5),D2
  301.  ADD.L D2,A0
  302.  ADD.L D2,A1
  303.  MOVE.W #10,D1
  304.  TST.B $43E
  305.  BNE COPYMOVE                   ; Set speed to 10 if using disk drive
  306.  TST.B $9BE
  307.  BNE COPYMOVE                     
  308.  MOVE.W MONOLINES(A5),D1        ; Otherwise get preset speed
  309. COPYMOVE:
  310.  BSR XEND                       ; COMBINE & MOVE TWO MONO LINES
  311.  SUBQ.L #2,A1                   ; BACK TO NORMAL PLANE
  312.  ADD.L #160,MONOPOS(A5)         ; DOWN ONE MED, TWO MONO LINES
  313.  ADD.W #1,MONOCOUNT(A5)         ; ONE MORE LINE
  314.  CMP.W #200,MONOCOUNT(A5)       ; DONE 200 ?
  315.  BNE NOT200
  316.  MOVE.L #0,MONOPOS(A5)          ; BACK TO TOP OF SCREEN
  317.  SUB.L #32000,A0                ; FOR MONO
  318.  SUB.L #32000,A1                ; AND MED
  319.  MOVE.W #0,MONOCOUNT(A5)        ; RESET THE COUNTER
  320. NOT200:
  321.  DBF D1,COPYMOVE                ; LOOP ROUND MONOLINES TIMES
  322.  MOVEM.L (SP)+,D0-D7/A0-A6
  323.  ADDQ.L #1,$466                 ; FIRST BIT OF NORMAL VBLANK
  324.  SUBQ.W #1,$452                 ; TEST IF ENABLED
  325.  BMI NOVBL                      ; SKIP IF NOT
  326.  MOVEM.L D0-D7/A0-A6,-(A7)
  327.  ADDQ.L #1,$462
  328.  SUB.L A5,A5
  329.  JMP $FC069E                    ; SKIP MONITOR DETECTION
  330. NOVBL:
  331.  ADDQ.W #1,$452
  332.  RTE                            ; NO VBLANK SO RETURN
  333.  
  334. GEN:                            
  335.  MOVE.W (A0)+,(A1)              ; FORTY MOVES TO MOVE ONE LINE
  336.  ADDQ.L #4,A1
  337.  
  338.  SUB.L #158,A1                  ; A1 BACK TO THE START OF THE LINE
  339.                                 
  340.  MOVE.W (A0)+,(A1)              ; THEN FORTY MOVES TO NEXT PLANE
  341.  ADDQ.L #4,A1
  342.  RTS
  343.  
  344. SPACE: DS.L 6
  345. XEND:
  346.  
  347. MESSAGE:
  348.  DC.B 27,'E','The Mono Emulator - Mick West 1987',13,10
  349.  DC.B        'This program is Shareware, If you',13,10
  350.  DC.B        'find it useful then send a donation to',13,10,13,10
  351.  DC.B        'Mick West',13,10
  352.  DC.B        '27 Lynton Drive',13,10
  353.  DC.B        'Shipley',13,10
  354.  DC.B        'West Yorkshire',13,10
  355.  DC.B        'BD18 3DJ',13,10
  356.  DC.B        'ENGLAND',13,10,13,10
  357.  DC.B        'Your Donation will be used to ',13,10
  358.  DC.B        'Develope more Shareware',13,10
  359.  DC.B        'This program can be freely copied.',13,10
  360.  DC.B 13,10,0
  361. INPUT:
  362.  DC.B 13,10
  363.  DC.B        'Enter speed (10 to 80, return = 40) '
  364.  
  365.  EVEN
  366. MONO:      EQU 0                ; ADDR OF MONO SCREEN
  367. MED:       EQU 4                ; ADDR OF REAL MEDIUM SCREEN
  368. MONOPOS:   EQU 8                ; POSITION IN MONO SCREEN
  369. MONOLINES: EQU 12               ; NO OF LINES/VBLANK
  370. MONOCOUNT: EQU 14               ; LINE NO IN MONO
  371.  
  372.  
  373.